package com.sfdk.graphics.core
{
import com.sfdk.graphics.api.IDisplayObjectContainerEx;
import com.sfdk.graphics.api.ITooltipHolder;
import com.sfdk.graphics.api.ITooltipManager;
import com.sfdk.graphics.tooltip.ToolTipHolder;
import com.sfdk.graphics.tooltip.ToolTipInfo;
import com.sfdk.graphics.tooltip.ToolTipSprite;
import com.sfdk.locale.LocalisedToolTipEngine;
import com.sfdk.log.Logger;

import flash.display.DisplayObject;
import flash.display.InteractiveObject;
import flash.display.Sprite;
import flash.events.MouseEvent;

/**
	 * Classe pour étendre certaines fonctions
	 **/
	public class SpriteEx extends Sprite implements ITooltipManager, IDisplayObjectContainerEx
	{
		private var toolTipHolder__ : ITooltipHolder;
		private var toolTipSprite_ : ToolTipSprite;
		
		public function SpriteEx()
		{
			super();
		}
		
		/**
		 * On vérifie que le sprite contient bien l'enfant avant de l'enlever
		 **/
		public override function removeChild(child : DisplayObject) : DisplayObject
		{
			if (child != null && this.contains(child))
			{
				return super.removeChild(child);
			}
			else
			{
				Logger.log("LSprite :: Trying to remove an display object that does not exist");
				return null;
			}
		}
		
		/**
		 * On ajoute un enfant avec plus de paramètre :)
		 **/
		public function attachChild(newChild : DisplayObject, xpos : int = 0, ypos : int = 0, elementName : String = "anoChild", vAlign : String = "none", hAlign : String = "none", topLayer : Boolean = true) : DisplayObject
		{
			var child : DisplayObject = this.getChildByName(elementName);
			// Pas deux instances avec le même nom
			if (child != null)
			{
				super.removeChild(child);	
			}
			if(xpos != 0 || hAlign == "none")
				newChild.x = xpos;
			if(ypos != 0 || vAlign == "none")
				newChild.y = ypos;
			
			if(hAlign == "center")
				newChild.x = (width - newChild.width) >> 1;
			if(vAlign == "center")
				newChild.y = (height - newChild.height) >> 1;
			
			if(elementName == "anoChild" && newChild.name == "anoChild")
				newChild.name = elementName;
			var childAdded : DisplayObject = super.addChild(newChild);
			if(!topLayer)
				super.swapChildrenAt(numChildren-1, numChildren-2);
			return childAdded; 
		}

		public function set toolTipHolder(value : ITooltipHolder) : void
		{
			// On initialise le ToolTipHolder à la volée
			toolTipHolder__ = value;
		}
		
		private function get toolTipHolder_() : ITooltipHolder
		{
			// On initialise le ToolTipHolder à la volée
			if(toolTipHolder__ == null)
				toolTipHolder__ = new ToolTipHolder(this);
			return toolTipHolder__;
		}
		
		/**
		 * On vérifie que le target à déjà un tooltip
		 **/
		public function hasToolTip(target : DisplayObject) : Boolean
		{
			return toolTipHolder_.hasToolTip(target);
		}
		
		/**
		 * On ajoute un toolTip au target
		 **/
		public function registerToolTip(target : DisplayObject, toolTipCode : String) : void
		{
			var toolTipLabel : String = LocalisedToolTipEngine.getToolTip(toolTipCode);
			var toolTip : ToolTipInfo = new ToolTipInfo(target.getBounds(this), toolTipLabel, target);
			toolTipHolder_.addToolTip(toolTip);
			target.addEventListener(MouseEvent.CLICK, toolTipHolder_.displayToolTip, false, 0, true);
			target.addEventListener(MouseEvent.ROLL_OUT, toolTipHolder_.hideToolTip, false, 0, true);
		}
		
		/**
		 * On enleve le toolTip du target
		 **/
		public function removeToolTip(target : DisplayObject) : void
		{
			 toolTipHolder_.removeToolTip(target);
		}
		
		/**
		 * On donne le focus à un des enfant du displayObject
		 **/
		public function setFocus(child : InteractiveObject) : void
		{
			if (child != null)
			{
				stage.focus = child;
			}
		}
		
		public function setToolTipSprite(toolTip : ToolTipSprite) : void
		{
			if(toolTip == null) // On veut enlever le toolTip actuel (si il existe)
			{
				if(this.contains(toolTipSprite_))
				{
					this.removeChild(toolTipSprite_);
				}
				toolTipSprite_ = null;
			}
			else
			{
				toolTipSprite_ = toolTip;
				if(!this.contains(toolTipSprite_))
				{
					addChild(toolTipSprite_);
				}				
			}
		}
		
		public function removeAllChildren() : void
		{
			while(numChildren > 0)
			{
				removeChildAt(0);
			}
		}
	}
}